﻿using Insesoft.Entities;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;

namespace InseSoft.Tests.Unit.Entities
{
    [TestClass]
    public class CotizacionTest
    {
        [TestMethod]
        public void Copy_PopulatedEntity_AllButSpecifiedPropertiesCopied()
        {
            var entity = new Cotizacion();
            TestHelper.PopulateEntity(entity);

            var copy = entity.Copy();

            Assert.AreNotSame(copy, entity);
            Assert.IsFalse(copy.Aplicada);
            Assert.AreEqual(0, copy.Id);
            Assert.IsNull(copy.FecAplicada);
            Assert.IsTrue(string.IsNullOrEmpty(copy.NumPedido));
        }
        
        [TestMethod]
        public void Calcular()
        {
            const decimal expectedPrecioMaterial = 1;
            const decimal expectedPrecioTintas = 2;
            const decimal expectedPrecioArte = 3;
            const decimal expectedPrecioPositivo = 4;
            const decimal expectedPrecioMolde = 5;
            const decimal expectedPrecioSolvente = 6;
            const decimal expectedPrecioCorte = 7;
            const decimal expectedPrecioImpresion = 8;
            const decimal expectedSubtotal = 9;
            const decimal expectedTotalCol = 10;
            const decimal expectedTotalUsd = 11;
            const decimal expectedPrecioUnitario = 12;
            var mock = new Mock<ICotizador>();
            const decimal dummyDecimal = 0;
            var precio = new Precio();
            var cotizacion = new Cotizacion{Empresa = new Empresa()};
            cotizacion.SetCotizador(mock.Object);
         
            mock.Setup(c => c.CalcularRendimientos());
            mock.Setup(c => c.CalcularPrecioMaterial(dummyDecimal)).Returns(expectedPrecioMaterial);
            mock.Setup(c => c.CalcularPrecioTintas(dummyDecimal)).Returns(expectedPrecioTintas);
            mock.Setup(c => c.CalcularPrecioArte(dummyDecimal)).Returns(expectedPrecioArte);
            mock.Setup(c => c.CalcularPrecioPositivo(dummyDecimal)).Returns(expectedPrecioPositivo);
            mock.Setup(c => c.CalcularPrecioMolde(dummyDecimal)).Returns(expectedPrecioMolde);
            mock.Setup(c => c.CalcularPrecioSolvente(dummyDecimal)).Returns(expectedPrecioSolvente);
            mock.Setup(c => c.CalcularPrecioCorte(dummyDecimal)).Returns(expectedPrecioCorte);
            mock.Setup(c => c.CalcularPrecioImpresion(precio)).Returns(expectedPrecioImpresion);
            mock.Setup(c => c.CalcularSubtotal()).Returns(expectedSubtotal);
            mock.Setup(c => c.CalcularTotalCol()).Returns(expectedTotalCol);
            mock.Setup(c => c.CalcularTotalUsd()).Returns(expectedTotalUsd);
            mock.Setup(c => c.CalcularPrecioUnitario()).Returns(expectedPrecioUnitario);
            
            cotizacion.Calcular(precio, dummyDecimal);

            mock.Verify(x => x.CalcularRendimientos(), Times.Exactly(1));
            mock.Verify(x => x.CalcularPrecioMaterial(dummyDecimal), Times.Exactly(1));
            mock.Verify(x => x.CalcularPrecioArte(dummyDecimal), Times.Exactly(1));
            mock.Verify(x => x.CalcularPrecioPositivo(dummyDecimal), Times.Exactly(1));
            mock.Verify(x => x.CalcularPrecioMolde(dummyDecimal), Times.Exactly(1));
            mock.Verify(x => x.CalcularPrecioSolvente(dummyDecimal), Times.Exactly(1));
            mock.Verify(x => x.CalcularPrecioCorte(dummyDecimal), Times.Exactly(1));
            mock.Verify(x => x.CalcularPrecioImpresion(precio), Times.Exactly(1));
            mock.Verify(x => x.CalcularSubtotal(), Times.Exactly(1));
            mock.Verify(x => x.CalcularTotalCol(), Times.Exactly(1));
            mock.Verify(x => x.CalcularTotalUsd(), Times.Exactly(1));
            mock.Verify(x => x.CalcularPrecioUnitario(), Times.Exactly(1));

            cotizacion.PrecioMaterial = expectedPrecioMaterial;
            cotizacion.PrecioTintas = expectedPrecioTintas;
            cotizacion.PrecioArte = expectedPrecioArte;
            cotizacion.PrecioPositivo = expectedPrecioPositivo;
            cotizacion.PrecioMolde = expectedPrecioMolde;
            cotizacion.PrecioSolvente = expectedPrecioSolvente;
            cotizacion.PrecioCorte = expectedPrecioCorte;
            cotizacion.Subtotal = expectedSubtotal;
            cotizacion.TotalCol = expectedTotalCol;
            cotizacion.TotalUsd = expectedTotalUsd;
            cotizacion.PrecioUnitario = expectedPrecioUnitario;
        }
    }
}
